/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package configuraciones;

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
//import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.cip.esymons.general.be.Menu;
//import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;
import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;
import org.richfaces.model.TreeNodeImpl;

/**
 *
 * @author Administrador
 */
public class MenuController {

    private MenuDelegate delegado;
    private ModuloDelegate delegadoModulo;
    private Menu menuSeleccionado;
    private Menu menu;
    private boolean actualizar;
    private TreeNode nodePrincipal = null;
    private TreeNode currentNode = null;
    private Integer tipoSeleccionado;
    private int modulo = 1;
    String titulo = "Colegiatura";
    private boolean esPagina;
    private String ruta;
    private List<Menu> listaMenu;
    private List<Menu> listaMenuAccesos;
    private Integer modCodigo;
    private String contexto;

    private Integer modCodigoE;
    private Menu menuAlterno;
    private boolean flag;
    private Boolean accede;
    private String fechaHoy;
    private String uweCuenta;


/********************************* Constructor ********************************/
    public MenuController() {
        //modulo = 0;
        modCodigo = 1;  //Colegiatura
        esPagina = true;
        menu = new Menu();
        delegado = new MenuDelegate();
        delegadoModulo = new ModuloDelegate();
        actualizar = true;
        tipoSeleccionado = 0;
        listaMenu = new ArrayList<Menu>();
        listaMenuAccesos = new ArrayList<Menu>();
        flag = false;
        accede = false;
        listar();
    }

/****************************** Setter and Getter *****************************/
    public Menu getMenu() {
        return menu;
    }
    public void setMenu(Menu menu) {
        this.menu = menu;
    }

    public String getUweCuenta() {
        return uweCuenta;
    }

    public void setUweCuenta(String uweCuenta) {
        this.uweCuenta = uweCuenta;
    }

    public Menu getMenuAlterno() {
        return menuAlterno;
    }
    public void setMenuAlterno(Menu menuAlterno) {
        //if (flag) menuAlterno =
        this.menuAlterno = menuAlterno;
    }

    public Boolean getAccede() {
        return accede;
    }

    public void setAccede(Boolean accede) {
        this.accede = accede;
    }

    public String getFechaHoy() {
        dameFecha();
        return fechaHoy;
    }

    public void setFecha(String fechaHoy) {
        this.fechaHoy = fechaHoy;
    }
    public Integer getModCodigoE() {
        return modCodigoE;
    }
    public void setModCodigoE(Integer modCodigoE) {
        this.modCodigoE = modCodigoE;
    }

    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public void fijarTipoElegido(ValueChangeEvent event) {
        tipoSeleccionado = new Integer(event.getNewValue().toString());
    }

    public Menu getMenuSeleccionado() {
        return menuSeleccionado;
    }
    public void setMenuSeleccionado(Menu menuSeleccionado) {
        this.menuSeleccionado = menuSeleccionado;
    }

    public Integer getTipoSeleccionado() {
        return tipoSeleccionado;
    }
    public void setTipoSeleccionado(Integer tipoSeleccionado) {
        this.tipoSeleccionado = tipoSeleccionado;
    }

    public int getModulo() {
        return modulo;
    }
    public void setModulo(int modulo) {
        this.modulo = modulo;
    }

    public String getRuta() {
        return ruta;
    }
    public void setRuta(String ruta) {
        this.ruta = ruta;
    }

    public List<Menu> getListaMenu() {
        return listaMenu;
    }
    public void setListaMenu(List<Menu> listaMenu) {
        this.listaMenu = listaMenu;
    }

    public Integer getModCodigo() {
        //System.out.println("menu prueba: " + menuAlterno.getMenCodigo() + " - " + menuAlterno.getMenNombre());
        actualizarContexto();
        return modCodigo;
    }
    public void setModCodigo(Integer modCodigo) {
        if (flag) modCodigo = modCodigoE;
        this.modCodigo = modCodigo;
    }

    public boolean getEsPagina() {
        return esPagina;
    }
    public void setEsPagina(boolean esPagina) {
        this.esPagina = esPagina;
    }

    public ModuloDelegate getDelegadoModulo() {
        return delegadoModulo;
    }
    public void setDelegadoModulo(ModuloDelegate delegadoModulo) {
        this.delegadoModulo = delegadoModulo;
    }

    public String getContexto() {
        return contexto;
    }
    public void setContexto(String contexto) {
        this.contexto = contexto;
    }

/*********************************** Metodos **********************************/
    public String eliminar() {
        try {
            System.out.println("menu: " + menu);
            if (menu == null) menu = new Menu();
            menu.setMenActivo(false);
            delegado.edit(menu);
            mostrarMensaje("INFO: ", "Pagina eliminada sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se pudo eliminar esta pagina...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return listar();
    }

    public void actualizarContexto() {
        switch (modCodigo) {
            case 1: contexto = "/colegiatura/faces/";   break;
            case 2: contexto = "/evento/faces/";        break;
            case 3: contexto = "/tesoreria/faces/";     break;
            case 4: contexto = "/tramite/faces/";       break;
            case 5: contexto = "/general/faces/";       break;
            case 6: contexto = "/sistemas/faces/";       break;
        }
    }

    public String guardar() {
        menu.setModCodigo(delegadoModulo.find(modCodigo));
        menu.setMenrutaPagina(contexto + menu.getMenrutaPagina());
        menu.setMenActivo(true);

        System.out.println("    DATOS MENU ");
        System.out.println("------------------");
        System.out.println("codigo: " + menu.getMenCodigo());
        System.out.println("sub menu: " + menu.getFkMenCodigoPadre());
        System.out.println("modulo: " + menu.getModCodigo());
        System.out.println("nombre: " + menu.getMenNombre());
        System.out.println("activo: " + menu.getMenActivo());
        System.out.println("ruta: " + menu.getMenrutaPagina());
        System.out.println("orden: " + menu.getMenOrden());
        delegado.create(menu);
        mostrarMensaje("INFO: ", "Pagina o mnú creada sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        menu = new Menu();
        return listar();
    }

    public String actualizar() {
        System.out.println("Menu: " + menu);
        delegado.edit(menu);
        return listar();
    }

//    public String datosReporte() {
//        HttpServletRequest request = ControladorAbstracto.getRequest();
//        request.setAttribute("paramReporte", "1");
//        request.setAttribute("paramNombreJasper", "rptAsistencia");
//        return null;
//    }

    public String listar() {
        //menu = new Menu();
        listaMenu = delegado.listarMenuActivos();
        return listarAccesos();
    }

    public String getInicio() {
        listarAccesos();
        return null;
    }

    public void setInicio(String inicio) {

    }

    public String listarAccesos() {
        /*
         * Verificar si el usuario tiene acceso al Menu
         */
        try {
            if (delegado == null) delegado = new MenuDelegate();
            HttpServletRequest request =  ControladorAbstracto.getRequest();
            HttpSession sesion = request.getSession();
            uweCuenta = (sesion.getAttribute("sCuenta") != null) ? (String)sesion.getAttribute("sCuenta") : "";
            listaMenuAccesos = delegado.listarMenus(uweCuenta);
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String ir_a_editar() {
        System.out.println("Probando edicion de paginas...");
        System.out.println("Nro Modulo: " + menu.getModCodigo().getModCodigo());
        System.out.println("Nro Menu: " + menu.getFkMenCodigoPadre().getMenCodigo());
        System.out.println("Modulo: " + menu.getModCodigo().getModNombre());
        System.out.println("Menu: " + menu.getFkMenCodigoPadre().getMenNombre());
        flag = true;
        modCodigoE = menu.getModCodigo().getModCodigo();
        menuAlterno = menu.getFkMenCodigoPadre();
        return "editar";
    }

    private void addNodes(TreeNode node, Menu padre) {
        List<Menu> lista = new ArrayList();
        System.out.println("usuario web: " + uweCuenta);
        if (padre == null) {
            lista = delegado.menuPadre(modulo);
            //lista = delegado.menuPadreA(modulo, uweCuenta);
        } else {
            //lista = delegado.menuHijo(padre);
            lista = delegado.menuHijoA(padre, uweCuenta);
        }
        if (lista != null) {
            for (Menu men : lista) {
                KeyMenu key = new KeyMenu();
                TreeNodeImpl nodeImpl = new TreeNodeImpl();
                key.setKey(String.valueOf(men.getMenNombre()));
                key.setRuta(men.getMenrutaPagina());
                key.setCodigo(men.getMenCodigo());
                for (Menu acceso : listaMenuAccesos) {
                    if (men.getMenCodigo() == acceso.getMenCodigo()) {
                        key.setAcceso("true");
                        accede = false;
                        break;
                    } else {
                        accede = true;
                    }
                }
                if (accede) {
                    key.setAcceso("false");
                    accede = false;
                }
                
                if (padre == null) {
                    key.setTipo("padre");
                } else {
                    key.setTipo("hijo");
                }
                nodeImpl.setData(key);
                node.addChild(key, nodeImpl);
                addNodes(nodeImpl, men);
            }
        }
    }

    private TreeNode loadTree() {
        try {
            TreeNode rootNode = null;
            rootNode = new TreeNodeImpl();
            addNodes(rootNode, null);
            return rootNode;
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
            return null;
        }
    }

    public void processSelection(NodeSelectedEvent event) {
        try {
            HtmlTree tree = (HtmlTree) event.getComponent();
            currentNode = tree.getModelTreeNode(tree.getRowKey());
            //int codigo = ((KeyMenu) currentNode.getData()).getCodigo();
            Integer codigo = ((KeyMenu) currentNode.getData()).getCodigo();
            menuSeleccionado = delegado.find(codigo);

            accede = false;
//            for (Menu men : listaMenuAccesos) {
//                if (menuSeleccionado == men) {
//                    System.out.println("ACCESO...!");
//                    accede = true;
//                    System.out.println("valor: " + menuSeleccionado);
//                    System.out.println("ruta: " + menuSeleccionado.getMenrutaPagina());
//                    break;
//                }
//            }
            System.out.println("valor: " + menuSeleccionado);
            System.out.println("ruta: " + menuSeleccionado.getMenrutaPagina());
        } catch (Exception ex) {
            System.out.println("Error" + ex.getMessage());
        }
    }

    public TreeNode getTreeNode() {
        if (actualizar) {
            nodePrincipal = loadTree();
            actualizar = false;
        }
        return nodePrincipal;
    }
    //fin arbol

    public String procesar() {
        EstadoProgreso progreso = new EstadoProgreso();
        progreso.empezar();
        progreso = null;
        return null;
    }

    public String terminar() {
        EstadoProgreso progreso = new EstadoProgreso();
        progreso.parar();
        progreso = null;
        return null;
    }

    public String cambiarMenu1() {
        modulo = 1;
        actualizar = true;
        titulo = "Colegiatura";
        getTreeNode();
        return "ir_a_portal";
    }

    public String cambiarMenu2() {
        modulo = 2;
        actualizar = true;
        titulo = "Eventos";
        getTreeNode();
        return "ir_a_portal";
    }

    public String cambiarMenu3() {
        modulo = 3;
        actualizar = true;
        titulo = "Tesoreria";
        getTreeNode();
        return "ir_a_portal";
    }

    public String cambiarMenu4() {
        modulo = 4;
        actualizar = true;
        titulo = "Tramite";
        getTreeNode();
        return "ir_a_portal";
    }

    public String cambiarMenu5() {
        modulo = 5;
        actualizar = true;
        titulo = "Configuraciones";
        getTreeNode();
        return "ir_a_portal";
    }

    public String cambiarMenu6() {
        modulo = 6;
        actualizar = true;
        titulo = "Sistemas";
        getTreeNode();
        return "ir_a_portal";
    }

    public String dameFecha() {
        fechaHoy = Utiles.fechaVigente();
        return null;
    }

    public String mostrarRuta() {
        System.out.println(menuSeleccionado.getMenrutaPagina());
        return "ir_a_principal";
    }

    public Menu buscarPorCodigo(Integer codigo){
        return delegado.find(codigo);
    }

    public SelectItem[] getComboMenu(){
        try{
            System.out.println("modulo codigo: " + modCodigo); 
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Menu> listaMenus = delegado.menuPadre(modCodigo);
            selects = new SelectItem[listaMenus.size()];
            int cont = 0;
            for(Menu menuX : listaMenus){
                SelectItem item = new SelectItem(menuX, menuX.getMenNombre());
                selects[cont] = item;
                cont++;
            }
            System.out.println("OK......combo menu");
            return selects;
        }catch(Exception e){
            System.out.println("Ingreso Error");
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen menus");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }



}
